package edu.tfh.s2.ehkbot.unitTest;

import static org.junit.Assert.*;


import org.junit.Test;

import edu.tfh.s2.ehkbot.gerete.sensoren.Bild;
import edu.tfh.s2.ehkbot.inventar.Ware;
import edu.tfh.s2.ehkbot.inventar.Warenbestand;
import edu.tfh.s2.ehkbot.inventar.Ware.Beschafenheit;

/**
 * Testet Warenbestand Funktion
 * 
 * @author s2zehn
 */
public class WarenbestandTest {
	private Warenbestand warenbestand = new Warenbestand();

	/**
	 * Fügt die Ware in der Menge zum Testen in den Warenbestand.
	 * 
	 * @param barcode
	 *            Der Barcode der Ware.
	 * @param menge
	 *            Die Menge der Ware.
	 */
	public void fuelleWarenbestand(int barcode, int menge) {
		int gewicht = 1000;
		int[] groesse = new int[] { 1000, 1000, 1000 };
		Beschafenheit[] beschafenheit = new Beschafenheit[] { Beschafenheit.FEST };
		Bild bild = new Bild(null);
		Ware wareZumEinfuegen = new Ware("H-Milch", gewicht, groesse, barcode, beschafenheit, bild);

		warenbestand.add(wareZumEinfuegen, menge);
	}

	/**
	 * Fügt die Ware mit verschiedne Barcodes in den Warenbestand. Testet , ob
	 * Barcodein der Liste Warenbesteand zu findensind.
	 * 
	 */
	@Test
	public void testeWarenbestand() {
		int[] barcodes = new int[] { 1, 1000, 2000, 4000, -300, 400 };
		int menge = 1;
		
		for (int code : barcodes) {
			fuelleWarenbestand(code, menge);
		}

		for (int code : barcodes) {
			testWarenbestand(code);
		}
	}

	/**
	 * Fügt die Ware mit verschiedne Barcodes in den Warenbestand. Testet , ob
	 * Barcodein der Liste Warenbesteand zu findensind.
	 */
	@Test
	public void testeWarenbestandBarcode() {
		int unteresLimit = -100000;
		int oberesLimit = 100000;
		int menge = 1;
		for (int i = unteresLimit; i < oberesLimit; ++i) {
			fuelleWarenbestand(i, menge);
		}

		for (int i = unteresLimit; i < oberesLimit; ++i) {
			testWarenbestand(i);
		}
	}

	/**
	 * Fügt Ware mit bestimmtes Barcodes und Menge in den Warenbestand. Testet ,
	 * ob diese Ware in Warenbesteand zu findensind.
	 */
	@Test
	public void testeWarenbestandMenge() {
		int barcode = 1000;
		int menge = 100;

		fuelleWarenbestand(barcode, menge);

		Ware wareZumBarcode = warenbestand.findeWare(barcode);
		assertTrue("Mengen stimmen nicht", menge == warenbestand.menge(wareZumBarcode));
	}

	/**
	 * @param barcode
	 *            Der Barcode der Ware.
	 */
	public void testWarenbestand(int barcode) {
		Ware gefunden = warenbestand.findeWare(barcode);
		assertNotNull("Die Ware wurde nicht gefunden", gefunden);
		assertEquals("Die Ware wurde nicht richtig gefunden", gefunden.getBarcode(), barcode);
	}
}
